[JavaScript] Symbol

前言

研究了下 Symbol 的實際用處,在此紀錄一下。

Private

Symbol 可讓物件有 Private 屬性,讓 Symbol 在遍歷的情況下不出現。

1
2
3
4
5
6
7
8
9
10
let sym = Symbol();
let o = {};
o[sym] = function(){};
for (let key in o ){
console.log(key); // nothing
}
console.log(Object.keys(o).length); // 0
console.log(JSON.stringify(o)); // {}
console.log(Object.getOwnPropertyNames(o)); // []

若需要取得 Symbol 可以透過 getOwnPropertySymbols

1
console.log(Object.getOwnPropertySymbols(o)); // [ Symbol() ]

Unique

每一個 Symbol 都是獨立的。

Object 一樣,即使兩個完全相同的 Object 但由於 reference 的不同而不同,因此可以藉由此特性來避免屬性衝突的問題。

1
Symbol('1') === Symbol('1') // false

Global

可以註冊 Symbol 在整個環境裡,如此一來同一個屬性的 Symbol 只會有同一個。

Symbol.for() 會查看有沒有該屬性的 Symbol 存在,有就返回該 Symbol , 無則註冊一個。

1
2
3
4
let sym = Symbol.for('123');
let sym2 = Symbol.for('123');
console.log(sym === sym2); // true
console.log(Symbol.keyFor(sym)); // 123